跳到主要内容

多线程 Worker

参考官网:https://developers.weixin.qq.com/miniprogram/dev/framework/workers.html

一些异步处理的任务,可以放置于 Worker 中运行,待运行结束后,再把结果返回到小程序主线程。Worker 运行于一个单独的全局上下文与线程中,不能直接调用主线程的方法

与主线程通信​

Worker 与主线程之间的数据传输,双方使用 Worker.postMessage() 来发送数据,Worker.onMessage() 来接收数据,传输的数据并不是直接共享,而是被复制的。

使用流程​

使用配置worker​

  • 在 app.json 中可配置 Worker 代码放置的目录,目录下的代码将被打包成一个文件,会作为小程序的主包一部分

为了使 worker 代码不占用首包体积,从基础库 v2.27.3 开始支持将 worker 代码打包为一个分包

app.json配置:

json
{
"workers": {
"path": "workers", // 目录下的所有 JS 代码最终将被打包成一个 JS 文件
"isSubpackage": true // true 表示把 worker 打包为分包。默认 false。填 false 时等同于 { "workers": "workers" }
}
}

添加worker文件​

text
workers/request/index.js
workers/request/utils.js
workers/response/index.js

其实最主要的就是workers/request/index.js,这个文件一定要有,是创建worker的依据,其他文件只是辅助来处理复杂的逻辑

js
const utils = require('./utils')

// 在 Worker 线程执行上下文会全局暴露一个 worker 对象,直接调用 worker.onMessage/postMessage 即可
// onMessage接受主线程消息
worker.onMessage(function (res) {
console.log(res)
})
// postMessage发送消息给主线程
worker.postMessage({
msg: 'hello worker'
})

使用场景​

  • 1、复杂计算逻辑

  • 2、在小游戏中会使用workers比较高,游戏会注重性能,小游戏一些复杂的计算消耗的时间,很难保证会低于10ms,这时往往会造成游戏帧率下降,并出现卡顿的情况,

  • 3、计算商品优惠券,涉及到叠加卷、换购券等

    • 计算最优的优惠方案选择、优惠券逻辑计算、商品分摊 【计算会比较耗时】